"""
@description 打包脚本
"""
import PyInstaller.__main__
import os
import shutil

def build_exe():
    """
    @description 打包为exe
    """
    # 清理之前的构建文件
    if os.path.exists('build'):
        shutil.rmtree('build')
    if os.path.exists('dist'):
        shutil.rmtree('dist')
    
    # PyInstaller参数
    params = [
        'main.py',                          # 主程序文件
        '--name=NetworkTools',              # 生成的exe名称
        '--noconsole',                      # 不显示控制台
        '--clean',                          # 清理临时文件
        '--onefile',                        # 打包为单个文件
        '--add-data=requirements.txt;.',    # 添加额外文件
        '--hidden-import=psutil',           # 添加隐式导入
        '--hidden-import=requests',
        '--hidden-import=dns',
        '--hidden-import=netifaces',
        '--hidden-import=win32api',
        '--hidden-import=win32con',
        '--hidden-import=win32security',
        '--collect-all=speedtest-cli',      # 收集所有speedtest相关文件
        '--collect-all=dns',                # 收集所有dns相关文件
        '--exclude-module=tkinter',         # 排除不需要的模块
        '--exclude-module=matplotlib',
        '--exclude-module=numpy',
        '--noupx',                          # 禁用UPX压缩以提高兼容性
    ]
    
    # 添加运行时钩子
    runtime_hooks = """
import sys
import os

def _patch_speedtest():
    try:
        import builtins
        sys.modules['__builtin__'] = builtins
    except ImportError:
        pass

_patch_speedtest()
"""
    
    # 创建运行时钩子文件
    with open('hook-runtime.py', 'w') as f:
        f.write(runtime_hooks)
    
    params.extend(['--runtime-hook=hook-runtime.py'])
    
    try:
        # 执行打包
        PyInstaller.__main__.run(params)
        print("打包完成！")
        print(f"可执行文件位置: {os.path.abspath('dist/NetworkTools.exe')}")
        
        # 清理钩子文件
        if os.path.exists('hook-runtime.py'):
            os.remove('hook-runtime.py')
            
    except Exception as e:
        print(f"打包过程中出现错误: {str(e)}")
    finally:
        # 清理临时文件
        if os.path.exists('hook-runtime.py'):
            os.remove('hook-runtime.py')

if __name__ == "__main__":
    build_exe() 